home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-05 / pcb121.zip / QUEUE.INC < prev    next >
Text File  |  1992-01-23  |  4KB  |  111 lines

  1. ;;****************************************************************************
  2. ;;                     queue.inc              queue.inc
  3. ;;****************************************************************************
  4. ;;
  5. ;;  Copyright (C) 1989 Northwestern University, Vance Morrison
  6. ;;
  7. ;;
  8. ;; Permission to view, compile, and modify for LOCAL (intra-organization) 
  9. ;; USE ONLY is hereby granted, provided that this copyright and permission 
  10. ;; notice appear on all copies.  Any other use by permission only.
  11. ;;
  12. ;; Northwestern University makes no representations about the suitability 
  13. ;; of this software for any purpose.  It is provided "as is" without expressed 
  14. ;; or implied warranty.  See the copywrite notice file for complete details.
  15. ;;
  16. ;;*************************************************************************
  17. ;;
  18. ;;  queue.inc implements a simple, general purpose, fixed lenght queue.
  19. ;;
  20. ;; AUTHOR: Vance Morrison
  21. ;; DATE:   5/24/89
  22. ;; ADDRESS: morrison@accuvax.nwu.edu
  23. ;;****************************************************************************
  24.  
  25. queue_data STRUC 
  26.     head    DW ?
  27.     tail    DW ?
  28. queue_data ENDS 
  29.  
  30.  
  31. ;;**************************************************************************
  32. ;; QUEUE_DECLARE declares a queue called 'name' that can hold 'len' entries
  33. ;; of size 'size'
  34. ;;
  35. QUEUE_DECLARE MACRO name, len, size
  36.  
  37.     .DATA
  38.     queue_&name&_len = len + 1
  39.     queue_&name&_size = size
  40.     global queue_&name&_data:queue_data
  41.     global queue_&name&_entries:byte
  42.     queue_&name&_end = queue_&name&_entries+(queue_&name&_size*queue_&name&_len)
  43.     .CODE
  44. ENDM
  45.  
  46.  
  47. ;;**************************************************************************
  48. ;; QUEUE_DEFINE allocates the necessary memory and initializes the queue
  49. ;;
  50. QUEUE_DEFINE MACRO name
  51. ifdef queue_&name&_len
  52.     .DATA
  53.     queue_&name&_data queue_data <>
  54.     queue_&name&_entries DB (queue_&name&_size * queue_&name&_len) dup (0)
  55.  
  56.     .CODE
  57.     mov queue_&name&_data.head, offset queue_&name&_entries
  58.     mov queue_&name&_data.tail, offset queue_&name&_entries
  59. endif
  60. ENDM
  61.  
  62.  
  63. ;;**************************************************************************
  64. ;; QUEUE_HEAD_out_SI returns the pointer to the head of the queue in SI.
  65. ;; if the queue is empty this macro jumps to 'empty'
  66. ;;
  67. QUEUE_HEAD_out_SI_const_AX_BX_CX_DX_BP_DI_ES MACRO name, empty
  68.  
  69.     mov SI, word ptr queue_&name&_data.head
  70.     cmp SI, word ptr queue_&name&_data.tail
  71.     jz empty
  72. ENDM
  73.  
  74.  
  75. ;;**************************************************************************
  76. ;; QUEUE_DEQUEUE_in_SI removes the head entry pointed to by SI from the
  77. ;; queue.  (SI was assumed to be inititialized by QUEUE_HEAD)
  78. ;;
  79. QUEUE_DEQUEUE_in_SI_const_AX_BX_CX_DX_BP_DI_ES MACRO name
  80.     local no_wrap
  81.  
  82.     add SI, offset queue_&name&_size
  83.     cmp SI, offset queue_&name&_end
  84.     jb no_wrap
  85.         mov SI, offset queue_&name&_entries
  86.     no_wrap:
  87.     mov word ptr queue_&name&_data.head, SI
  88. ENDM
  89.  
  90.  
  91. ;;**************************************************************************
  92. ;; QUEUE_ENQUEUE enqueues a buffer and returns its pointer in DI.  The
  93. ;; entry can then be filled in as desired.
  94. ;;
  95. QUEUE_ENQUEUE_out_DI_const_BX_CX_DX_BP_SI_ES MACRO name, full
  96.     local no_wrap
  97.  
  98.     mov DI, queue_&name&_data.tail          ;; increment with wrap
  99.     mov AX, DI                              ;; save DI
  100.     add DI, offset queue_&name&_size
  101.     cmp DI, offset queue_&name&_end
  102.     jb no_wrap
  103.         mov DI, offset queue_&name&_entries
  104.     no_wrap:
  105.     cmp DI, word ptr queue_&name&_data.head
  106.     jz full
  107.     mov queue_&name&_data.tail, DI
  108.     mov DI, AX
  109. ENDM
  110.  
  111.